unit krclasses;

interface

uses
  SysUtils;

type
  TCliente = Class
  private
    fNome: String;
    fIdade: Integer;
    fDataNasc: TDateTime;
    constructor Create;
    destructor Destroy;
  public
    procedure CalculaIdade;
    property Nome: String read fNome write fNome;
    property Idade: Integer read fIdade;
    property DataNasc: TDateTime read fDataNasc write fDataNasc;
  end;

  TItem = Class
  private
    fCodigo: Integer;
    fNome: String;
  public
    constructor Create;
    destructor Destroy;
    property Codigo: Integer read fCodigo write fCodigo;
    property Nome: String read fNome write fNome;
  end;

  TItemVenda = Class
  private
    fItem: TItem;
    fQtdItem,
    fValorItem: Double;
  public
    constructor Create;
    destructor Destroy;
    property Item: TItem read fItem write fItem;
    property QtdItem: Double read fQtdItem write fQtdItem;
    property ValorItem: Double read fValorItem write fValorItem;
  end;
  TArrayItemVenda = Array of TItemVenda;

  TVendas = Class
  private
    fCodigo: Integer;
    fCliente: TCliente;
    fData: TDateTime;
    fValorTotal,
    fTotalDoItem: Double;
    fItensDaVenda: TArrayItemVenda;
  public
    constructor Create;
    destructor Destroy;
    property Codigo: Integer read fCodigo write fCodigo;
    property Cliente: TCliente read fCliente write fCliente;
    property Data: TDateTime read fData write fData;
    property TotalDoItem: Double read fTotalDoItem;
    property ValorTotal: Double read fValorTotal;
    property ItensDaVenda: TArrayItemVenda read fItensDaVenda write fItensDaVenda;
    procedure CalculaValorTotal;
    procedure CalculaValorTotalItem;
    procedure SetTamanhoItensVendas(tam: Integer);
    procedure NovoItemVenda(NomeItem:String;Quant,Valor:Double);
  end;

implementation

{ TCliente }

procedure TCliente.CalculaIdade;
begin
  fIdade:= Trunc((Now - fDataNasc)/365);
end;

constructor TCliente.Create;
begin
  fNome:= '';
  fIdade:= 0;
  fDataNasc:= 0;
end;

destructor TCliente.Destroy;
begin
//
end;

procedure TVendas.CalculaValorTotal;
var
  i: Integer;
begin
  fValorTotal := 0;
  for I := Low(fItensDaVenda) to (Length(fItensDaVenda)-1) do
   fValorTotal := fValorTotal + (fItensDaVenda[i].fQtdItem * (fItensDaVenda[i].ValorItem));
end;

procedure TVendas.CalculaValorTotalItem;
begin
  fTotalDoItem := 0;
   fTotalDoItem := (fItensDaVenda[Length(fItensDaVenda)-1].fQtdItem * (fItensDaVenda[Length(fItensDaVenda)-1].ValorItem));
end;


constructor TVendas.Create;
begin
  fCodigo := 0;
  fCliente := TCliente.Create;
  fData := 0;
  fValorTotal := 0;
  SetTamanhoItensVendas(0);
end;

destructor TVendas.Destroy;
begin
  fCliente.Free;
end;

{ TItemVenda }

constructor TItemVenda.Create;
begin
  fItem := TItem.Create;
  fQtdItem := 0;
  fValorItem := 0;
end;

destructor TItemVenda.Destroy;
begin
  fItem.Free;
end;

{ TItem }

constructor TItem.Create;
begin
  fNome := '';
end;

destructor TItem.Destroy;
begin
//
end;

procedure TVendas.NovoItemVenda(NomeItem:String;Quant,Valor:Double);
begin
  if fItensDaVenda = nil then
  begin
    //Length(fItensDaVenda) := 1;
    SetTamanhoItensVendas(1);
    fItensDaVenda[Length(fItensDaVenda)-1] := TItemVenda.Create;
    fItensDaVenda[Length(fItensDaVenda)-1].fItem.Nome := NomeItem;
    fItensDaVenda[Length(fItensDaVenda)-1].fQtdItem := Quant;
    fItensDaVenda[Length(fItensDaVenda)-1].fValorItem := Valor;
  end
  else
  begin
    SetTamanhoItensVendas(Length(fItensDaVenda)+1);
    fItensDaVenda[Length(fItensDaVenda)-1] := TItemVenda.Create;
    fItensDaVenda[Length(fItensDaVenda)-1].fItem.Nome := NomeItem;
    fItensDaVenda[Length(fItensDaVenda)-1].fQtdItem := Quant;
    fItensDaVenda[Length(fItensDaVenda)-1].fValorItem := Valor;
  end;
end;

procedure TVendas.SetTamanhoItensVendas(tam: Integer);
begin
  SetLength(fItensDaVenda,tam);
end;


end.
